<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
<meta name="generator" content="pdoc 0.10.0" />
<title>Euro-Truck-Simulator-2-Lane-Assist.plugins.VirtualSimAPI.main API documentation</title>
<meta name="description" content="" />
<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/ir-black.min.css" crossorigin>
<style>
:root {
--highlight-color: #202;
}
html {
scrollbar-face-color: #646464;
scrollbar-base-color: #646464;
scrollbar-3dlight-color: #646464;
scrollbar-highlight-color: #646464;
scrollbar-track-color: #000;
scrollbar-arrow-color: #000;
scrollbar-shadow-color: #646464;
scrollbar-dark-shadow-color: #646464;
}
::-webkit-scrollbar { width: 14px; height: 3px;}
::-webkit-scrollbar-button {
background-color: #000;
height: 3px;}
::-webkit-scrollbar-track {
background-color: #646464;}
::-webkit-scrollbar-track-piece { background-color: #000;}
::-webkit-scrollbar-thumb { height: 50px; background-color: #666; border-radius: 7px;}
::-webkit-scrollbar-corner { background-color: #646464;}
::-webkit-resizer { background-color: #666;}
.flex {
display: flex !important;
}
body {
line-height: 1.5em;
color: #fff;
background-color: #1e1e1e;
font: 14px/1.5 Helvetica, Arial, sans-serif;
margin: 0;
padding: 0;
}
#content {
padding: 20px;
}
#sidebar {
padding: 30px;
overflow: hidden;
}
#sidebar>*:last-child {
margin-bottom: 2cm;
}
.http-server-breadcrumbs {
font-size: 130%;
margin: 0 0 15px 0;
}
#footer {
font-size: .75em;
padding: 5px 30px;
border-top: 1px solid #fff;
text-align: right;
}
#footer p {
margin: 0 0 0 1em;
display: inline-block;
}
#footer p:last-child {
margin-right: 30px;
}
h1,
h2,
h3,
h4,
h5 {
font-weight: 300;
color: #fff;
}
h1 {
font-size: 2.5em;
line-height: 1.1em;
}
h2 {
font-size: 1.75em;
margin: 1em 0 .50em 0;
}
h3 {
font-size: 1.4em;
margin: 25px 0 10px 0;
}
h4 {
margin: 0;
font-size: 105%;
}
h1:target,
h2:target,
h3:target,
h4:target,
h5:target,
h6:target {
background: #1e1e1e;
padding: 0.2em 0;
}
a {
color: #8fd6fc;
text-decoration: none;
transition: color .3s ease-in-out;
}
a:hover {
color: #00a4fc;
}
.title code {
font-weight: bold;
}
h2[id^="header-"] {
margin-top: 2em;
}
.ident {
color: #f6fc85;
}
strong {
color: #8fd6fc;
}
pre code {
background: transparent;
font-size: .8em;
line-height: 1.4em;
}
code {
background: rgba(255, 255, 255, 0.1);
padding: 1px 4px;
overflow-wrap: break-word;
}
h1 code {
background: transparent
}
pre {
background: transparent;
border: 0;
border-top: 1px solid #ccc;
border-bottom: 1px solid #ccc;
margin: 1em 0;
padding: 1ex;
}
#http-server-module-list {
display: flex;
flex-flow: column;
}
#http-server-module-list div {
display: flex;
}
#http-server-module-list dt {
min-width: 10%;
}
#http-server-module-list p {
margin-top: 0;
}
.toc ul,
#index {
list-style-type: none;
margin: 0;
padding: 0;
}
#index code {
background: transparent;
}
#index h3 {
border-bottom: 1px solid #ddd;
}
#index ul {
padding: 0;
}
#index h4 {
margin-top: .6em;
font-weight: bold;
}
/* Make TOC lists have 2+ columns when viewport is wide enough.
Assuming ~20-character identifiers and ~30% wide sidebar. */
@media (min-width: 200ex) {
#index .two-column {
column-count: 2
}
}
@media (min-width: 300ex) {
#index .two-column {
column-count: 3
}
}
dl {
margin-bottom: 2em;
}
dl dl:last-child {
margin-bottom: 4em;
}
dd {
margin: 0 0 1em 3em;
}
#header-classes+dl>dd {
margin-bottom: 3em;
}
dd dd {
margin-left: 2em;
}
dd p {
margin: 10px 0;
}
.name {
background: #000;
font-weight: bold;
font-size: .85em;
padding: 5px 10px;
display: inline-block;
min-width: 40%;
}
.name:hover {
background: #0b0b0b;
}
dt:target .name {
background: var(--highlight-color);
}
.name>span:first-child {
white-space: nowrap;
}
.name.class>span:nth-child(2) {
margin-left: .4em;
}
.inherited {
color: #999;
border-left: 5px solid #eee;
padding-left: 1em;
}
.inheritance em {
font-style: normal;
font-weight: bold;
}
.pydefname {
color: #f90;
}
/* Docstrings titles, e.g. in numpydoc format */
.desc h2 {
font-weight: 400;
font-size: 1.25em;
}
.desc h3 {
font-size: 1em;
}
.desc dt code {
background: inherit;
/* Don't grey-back parameters */
}
.source summary,
.git-link-div {
color: #666;
text-align: right;
font-weight: 400;
font-size: .8em;
text-transform: uppercase;
}
.source summary>* {
white-space: nowrap;
cursor: pointer;
}
.git-link {
color: inherit;
margin-left: 1em;
}
.source pre {
max-height: 500px;
overflow: auto;
margin: 0;
}
.source pre code {
font-size: 12px;
overflow: visible;
}
.hlist {
list-style: none;
}
.hlist li {
display: inline;
}
.hlist li:after {
content: ',\2002';
}
.hlist li:last-child:after {
content: none;
}
.hlist .hlist {
display: inline;
padding-left: 1em;
}
img {
max-width: 100%;
}
td {
padding: 0 .5em;
}
.admonition {
padding: .1em .5em;
margin-bottom: 1em;
}
.admonition-title {
font-weight: bold;
}
.admonition.note,
.admonition.info,
.admonition.important {
background: #00a;
}
.admonition.todo,
.admonition.versionadded,
.admonition.tip,
.admonition.hint {
background: #050;
}
.admonition.warning,
.admonition.versionchanged,
.admonition.deprecated {
background: #ec0;
}
.admonition.error,
.admonition.danger,
.admonition.caution {
background: #c20010;
}
p {
color: #fff;
}
</style>
<style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
<style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
</head>
<body>
<main>
<article id="content">
<header>
<h1 class="title">Module <code>Euro-Truck-Simulator-2-Lane-Assist.plugins.VirtualSimAPI.main</code></h1>
</header>
<section id="section-intro">
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">from plugins.plugin import PluginInformation
from src.logger import print

PluginInfo = PluginInformation(
    name=&#34;VirtualSimAPI&#34;, # This needs to match the folder name under plugins (this would mean plugins\Plugin\main.py)
    description=&#34;Will output the default values for the API.\nMainly used for development since\nETS2 can be closed.&#34;,
    version=&#34;0.1&#34;,
    author=&#34;Tumppi066&#34;,
    url=&#34;https://github.com/Tumppi066/euro-truck-simulator-2-lane-assist&#34;,
    type=&#34;dynamic&#34;, # = Panel
    dynamicOrder=&#34;before image capture&#34; # Will run the plugin before anything else in the mainloop (data will be empty)
)

import tkinter as tk
from tkinter import ttk
import src.helpers as helpers
import src.mainUI as mainUI
import src.variables as variables
import src.settings as settings
from src.loading import LoadingWindow
from src.translator import Translate
import src.mainUI as mainUI
import time
import os
import math
from plugins.VirtualSimAPI.scsPlugin import scsTelemetry
import plugins.VirtualSimAPI.scsPlugin as scsPlugin
import keyboard as kb

# The main file runs the &#34;plugin&#34; function each time the plugin is called
# The data variable contains the data from the mainloop, plugins can freely add and modify data as needed
# The data from the last frame is contained under data[&#34;last&#34;]
API = None
lastX = 0
lastY = 0
isConnected = False


def plugin(data):
    global API
    global lastX
    global lastY
    
    apiData = API.update()    
    data[&#34;api&#34;] = apiData
    
    # Listen for the arrow keys and move the &#34;truck&#34; accordingly
    if kb.is_pressed(&#34;up&#34;):
        scsPlugin.virtualZ += 10 * data[&#34;last&#34;][&#34;executionTimes&#34;][&#34;all&#34;] * 40
    if kb.is_pressed(&#34;down&#34;):
        scsPlugin.virtualZ -= 10 * data[&#34;last&#34;][&#34;executionTimes&#34;][&#34;all&#34;] * 40
    if kb.is_pressed(&#34;left&#34;): 
        scsPlugin.virtualX -= 10 * data[&#34;last&#34;][&#34;executionTimes&#34;][&#34;all&#34;] * 40
    if kb.is_pressed(&#34;right&#34;): 
        scsPlugin.virtualX += 10 * data[&#34;last&#34;][&#34;executionTimes&#34;][&#34;all&#34;] * 40
    
    # Calculate the current driving angle based on this and last frames coordinates
    try:
        x = apiData[&#34;truckPosition&#34;][&#34;coordinateX&#34;]
        y = apiData[&#34;truckPosition&#34;][&#34;coordinateZ&#34;]
        
        dx = x - lastX
        dy = y - lastY
        
        # Make them a unit vector
        velocity = math.sqrt(dx**2 + dy**2)
        
        # Calculate the angle
        angle = math.degrees(math.atan2(dy, dx))
        
        # Add some smoothening to the angle
        try:
            angle = angle * 0.025 + data[&#34;last&#34;][&#34;api&#34;][&#34;angle&#34;] * 0.975
        except: pass
        data[&#34;api&#34;][&#34;angle&#34;] = angle
        data[&#34;api&#34;][&#34;velocity&#34;] = [dx, dy]
        
        lastY = y
        lastX = x
        
    except: pass

    return data # Plugins need to ALWAYS return the data


# Plugins need to all also have the onEnable and onDisable functions
def onEnable():
    global API
    if API == None:
        API = scsTelemetry()
    
def onDisable():
    global stop
    global loading
    
    stop = True
    try:
        loading.destroy()
    except: pass

class UI():
    try: # The panel is in a try loop so that the logger can log errors if they occur
        
        def __init__(self, master) -&gt; None:
            self.master = master # &#34;master&#34; is the mainUI window
            self.exampleFunction()
        
        def destroy(self):
            self.done = True
            self.root.destroy()
            del self

        def updateData(self):
            self.list.delete(0, tk.END)
            # recursively get all the data from the API
            for key, value in self.data[&#34;api&#34;].items():
                if type(value) == dict:
                    self.list.insert(tk.END, key + &#34;:&#34;)
                    for key2, value2 in value.items():
                        self.list.insert(tk.END, &#34;    &#34; + key2 + &#34;: &#34; + str(value2))
                else:
                    self.list.insert(tk.END, key + &#34;: &#34; + str(value))
        
        def exampleFunction(self):
            
            try:
                self.root.destroy() # Load the UI each time this plugin is called
            except: pass
            
            self.root = tk.Canvas(self.master, width=600, height=520, border=0, highlightthickness=0)
            self.root.grid_propagate(0) # Don&#39;t fit the canvast to the widgets
            self.root.pack_propagate(0)
            
            
            ttk.Button(self.root, text=Translate(&#34;Update Data&#34;), command=self.updateData).pack()
            ttk.Label(self.root, text=Translate(&#34;Will only work when the app is enabled -&gt; scrollable&#34;)).pack()
            # Create a list to hold all of the API data
            self.listVar = tk.StringVar()
            self.list = tk.Listbox(self.root, width=600, height=520, border=0, highlightthickness=0, listvariable=self.listVar)
            self.list.pack()
            
            
            self.root.pack(anchor=&#34;center&#34;, expand=False)
            self.root.update()
        
        
        def update(self, data): # When the panel is open this function is called each frame 
            self.root.update()
            self.data = data
    
    except Exception as ex:
        print(ex.args)</code></pre>
</details>
</section>
<section>
</section>
<section>
</section>
<section>
<h2 class="section-title" id="header-functions">Functions</h2>
<dl>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.VirtualSimAPI.main.onDisable"><code class="name flex">
<span>def <span class="ident">onDisable</span></span>(<span>)</span>
</code></dt>
<dd>
<div class="desc"></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def onDisable():
    global stop
    global loading
    
    stop = True
    try:
        loading.destroy()
    except: pass</code></pre>
</details>
</dd>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.VirtualSimAPI.main.onEnable"><code class="name flex">
<span>def <span class="ident">onEnable</span></span>(<span>)</span>
</code></dt>
<dd>
<div class="desc"></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def onEnable():
    global API
    if API == None:
        API = scsTelemetry()</code></pre>
</details>
</dd>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.VirtualSimAPI.main.plugin"><code class="name flex">
<span>def <span class="ident">plugin</span></span>(<span>data)</span>
</code></dt>
<dd>
<div class="desc"></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def plugin(data):
    global API
    global lastX
    global lastY
    
    apiData = API.update()    
    data[&#34;api&#34;] = apiData
    
    # Listen for the arrow keys and move the &#34;truck&#34; accordingly
    if kb.is_pressed(&#34;up&#34;):
        scsPlugin.virtualZ += 10 * data[&#34;last&#34;][&#34;executionTimes&#34;][&#34;all&#34;] * 40
    if kb.is_pressed(&#34;down&#34;):
        scsPlugin.virtualZ -= 10 * data[&#34;last&#34;][&#34;executionTimes&#34;][&#34;all&#34;] * 40
    if kb.is_pressed(&#34;left&#34;): 
        scsPlugin.virtualX -= 10 * data[&#34;last&#34;][&#34;executionTimes&#34;][&#34;all&#34;] * 40
    if kb.is_pressed(&#34;right&#34;): 
        scsPlugin.virtualX += 10 * data[&#34;last&#34;][&#34;executionTimes&#34;][&#34;all&#34;] * 40
    
    # Calculate the current driving angle based on this and last frames coordinates
    try:
        x = apiData[&#34;truckPosition&#34;][&#34;coordinateX&#34;]
        y = apiData[&#34;truckPosition&#34;][&#34;coordinateZ&#34;]
        
        dx = x - lastX
        dy = y - lastY
        
        # Make them a unit vector
        velocity = math.sqrt(dx**2 + dy**2)
        
        # Calculate the angle
        angle = math.degrees(math.atan2(dy, dx))
        
        # Add some smoothening to the angle
        try:
            angle = angle * 0.025 + data[&#34;last&#34;][&#34;api&#34;][&#34;angle&#34;] * 0.975
        except: pass
        data[&#34;api&#34;][&#34;angle&#34;] = angle
        data[&#34;api&#34;][&#34;velocity&#34;] = [dx, dy]
        
        lastY = y
        lastX = x
        
    except: pass

    return data # Plugins need to ALWAYS return the data</code></pre>
</details>
</dd>
</dl>
</section>
<section>
<h2 class="section-title" id="header-classes">Classes</h2>
<dl>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.VirtualSimAPI.main.UI"><code class="flex name class">
<span>class <span class="ident">UI</span></span>
<span>(</span><span>master)</span>
</code></dt>
<dd>
<div class="desc"></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">class UI():
    try: # The panel is in a try loop so that the logger can log errors if they occur
        
        def __init__(self, master) -&gt; None:
            self.master = master # &#34;master&#34; is the mainUI window
            self.exampleFunction()
        
        def destroy(self):
            self.done = True
            self.root.destroy()
            del self

        def updateData(self):
            self.list.delete(0, tk.END)
            # recursively get all the data from the API
            for key, value in self.data[&#34;api&#34;].items():
                if type(value) == dict:
                    self.list.insert(tk.END, key + &#34;:&#34;)
                    for key2, value2 in value.items():
                        self.list.insert(tk.END, &#34;    &#34; + key2 + &#34;: &#34; + str(value2))
                else:
                    self.list.insert(tk.END, key + &#34;: &#34; + str(value))
        
        def exampleFunction(self):
            
            try:
                self.root.destroy() # Load the UI each time this plugin is called
            except: pass
            
            self.root = tk.Canvas(self.master, width=600, height=520, border=0, highlightthickness=0)
            self.root.grid_propagate(0) # Don&#39;t fit the canvast to the widgets
            self.root.pack_propagate(0)
            
            
            ttk.Button(self.root, text=Translate(&#34;Update Data&#34;), command=self.updateData).pack()
            ttk.Label(self.root, text=Translate(&#34;Will only work when the app is enabled -&gt; scrollable&#34;)).pack()
            # Create a list to hold all of the API data
            self.listVar = tk.StringVar()
            self.list = tk.Listbox(self.root, width=600, height=520, border=0, highlightthickness=0, listvariable=self.listVar)
            self.list.pack()
            
            
            self.root.pack(anchor=&#34;center&#34;, expand=False)
            self.root.update()
        
        
        def update(self, data): # When the panel is open this function is called each frame 
            self.root.update()
            self.data = data
    
    except Exception as ex:
        print(ex.args)</code></pre>
</details>
<h3>Methods</h3>
<dl>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.VirtualSimAPI.main.UI.destroy"><code class="name flex">
<span>def <span class="ident">destroy</span></span>(<span>self)</span>
</code></dt>
<dd>
<div class="desc"></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def destroy(self):
    self.done = True
    self.root.destroy()
    del self</code></pre>
</details>
</dd>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.VirtualSimAPI.main.UI.exampleFunction"><code class="name flex">
<span>def <span class="ident">exampleFunction</span></span>(<span>self)</span>
</code></dt>
<dd>
<div class="desc"></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def exampleFunction(self):
    
    try:
        self.root.destroy() # Load the UI each time this plugin is called
    except: pass
    
    self.root = tk.Canvas(self.master, width=600, height=520, border=0, highlightthickness=0)
    self.root.grid_propagate(0) # Don&#39;t fit the canvast to the widgets
    self.root.pack_propagate(0)
    
    
    ttk.Button(self.root, text=Translate(&#34;Update Data&#34;), command=self.updateData).pack()
    ttk.Label(self.root, text=Translate(&#34;Will only work when the app is enabled -&gt; scrollable&#34;)).pack()
    # Create a list to hold all of the API data
    self.listVar = tk.StringVar()
    self.list = tk.Listbox(self.root, width=600, height=520, border=0, highlightthickness=0, listvariable=self.listVar)
    self.list.pack()
    
    
    self.root.pack(anchor=&#34;center&#34;, expand=False)
    self.root.update()</code></pre>
</details>
</dd>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.VirtualSimAPI.main.UI.update"><code class="name flex">
<span>def <span class="ident">update</span></span>(<span>self, data)</span>
</code></dt>
<dd>
<div class="desc"></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def update(self, data): # When the panel is open this function is called each frame 
    self.root.update()
    self.data = data</code></pre>
</details>
</dd>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.VirtualSimAPI.main.UI.updateData"><code class="name flex">
<span>def <span class="ident">updateData</span></span>(<span>self)</span>
</code></dt>
<dd>
<div class="desc"></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def updateData(self):
    self.list.delete(0, tk.END)
    # recursively get all the data from the API
    for key, value in self.data[&#34;api&#34;].items():
        if type(value) == dict:
            self.list.insert(tk.END, key + &#34;:&#34;)
            for key2, value2 in value.items():
                self.list.insert(tk.END, &#34;    &#34; + key2 + &#34;: &#34; + str(value2))
        else:
            self.list.insert(tk.END, key + &#34;: &#34; + str(value))</code></pre>
</details>
</dd>
</dl>
</dd>
</dl>
</section>
</article>
<nav id="sidebar">
<h1>Index</h1>
<div class="toc">
<ul></ul>
</div>
<ul id="index">
<li><h3>Super-module</h3>
<ul>
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.VirtualSimAPI" href="index.html">Euro-Truck-Simulator-2-Lane-Assist.plugins.VirtualSimAPI</a></code></li>
</ul>
</li>
<li><h3><a href="#header-functions">Functions</a></h3>
<ul class="">
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.VirtualSimAPI.main.onDisable" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.VirtualSimAPI.main.onDisable">onDisable</a></code></li>
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.VirtualSimAPI.main.onEnable" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.VirtualSimAPI.main.onEnable">onEnable</a></code></li>
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.VirtualSimAPI.main.plugin" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.VirtualSimAPI.main.plugin">plugin</a></code></li>
</ul>
</li>
<li><h3><a href="#header-classes">Classes</a></h3>
<ul>
<li>
<h4><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.VirtualSimAPI.main.UI" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.VirtualSimAPI.main.UI">UI</a></code></h4>
<ul class="">
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.VirtualSimAPI.main.UI.destroy" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.VirtualSimAPI.main.UI.destroy">destroy</a></code></li>
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.VirtualSimAPI.main.UI.exampleFunction" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.VirtualSimAPI.main.UI.exampleFunction">exampleFunction</a></code></li>
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.VirtualSimAPI.main.UI.update" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.VirtualSimAPI.main.UI.update">update</a></code></li>
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.VirtualSimAPI.main.UI.updateData" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.VirtualSimAPI.main.UI.updateData">updateData</a></code></li>
</ul>
</li>
</ul>
</li>
</ul>
</nav>
</main>
<footer id="footer">
<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.10.0</a>.</p>
</footer>
</body>
</html>